Funkcije - kultura


Grupa TNT

Za uvod si najprej preberite nekaj o stripu Alan Ford (in še nekaj).

1. podnaloga

Lakota

Broj 1 je z zaskrbljenostjo potresel škatlo. Le nekaj fižolovih zrn je še ostalo. Spet lakota v Cvetličarni. Začel je deliti - eno zrno za Alana, eno za Jeremijo, eno zanj, eno za Grunfa. In spet eno zrno za Alana, eno za Jeremijo, eno zanj, eno za Grunfa in ... Ko so mu ostala manj kot 4 zrna, je zavzdihnil in vsa pospravil na svoj kupček. Že je želel poklicati k večerji, ko je v kotu zastokal Jeremija in se prebudi. Ah, tudi on mora dobiti svoj delež. Zrna na kup in eno za Alana, eno za Grunfa, ... Seveda, ko je bilo manj kot pet zrn, gredo spet vsa na kupček Broja 1. In ko je bil že skoraj pri koncu, se od nekje pojavita Oliver in Bob Rock. In spet od začetka ...

Da bo šlo hitreje, sestavi funkcijo zrna(fižoli, številoOseb), ki za dano število zrn in oseb vrne koliko zrn dobijo člani skupine TNT in koliko Broj 1. Npr.

     >>>zrna(72, 5)
     14, 16

Uradna rešitev

def zrna(koliko, osebe):
    '''Koliko zrn dobi osebe oseb, če vsi dobijo v načelu enako,
    morebiten preostanek pa pripade dodatno eni osebi'''
    večina = koliko // osebe
    en = koliko - večina * (osebe - 1)
    return večina, en

2. podnaloga

sir Oliver, izposojena ura in jašek

Na sprehodu sir Oliver čisto slučajno zavije v zlatarno in čez nekaj trenutkov je že zunaj, s kričečim prodajalcem za sabo. Par hitrih zavojev in ko že kaže, da je sir Oliver ušel, se znajde v slepi ulici. Gentleman kot sir Oliver definitivno je, si ne bo dovolil, da bi ga zasačili z uro, ki si jo je sposodil, zato jo hitro odvrže v navpični jašek na dnu katerega je malo vode. Skrbno posluša in čez nekaj časa zasliši čof. Pomagaj mu in napiši funkcijo globinaJaška(čas), ki za podatek koliko časa je minilo od trenutka, ko je sir Oliver spustil uro, do trenutka, ko je reklo čof, vrne na tri decimalke natančno globino jaška v metrih. Če ne poznaš enačb, si pomagaj z wikipedijo. Za gravitacijski pospešek vzemi 9.81 m/s.

Namig: Python pozna funkcijo round(x, n). Kaj pa dela, ugotovi v dokumentaciji ali pa bo dovolj, da pogledaš naslednjo nalogo.

Uradna rešitev

def globinaJaška(t):
    '''Kako globok jke jašek, če premet pada t sekund'''
    g = 9.81
    globina = 0.5 * g * t**2
    rez = round(globina, 3)
    return rez

3. podnaloga

Grunf topničar

Grunf strelja s topom na domovanje Superhika, a ga nikakor ne more zadeti.

Tukaj je funkcija, ki izračuna maksimalno višino leta krogle,

      import math
      def maxViš(v, kot):
         '''Maks. višina pri poševnem metu'''
         kotRad = kot * math.pi / 180
         najV = v**2 * math.sin(kotRad)**2
         g = 10.0
         zaokr = round(najV / (2*g), 1)
         return zaokr

a kaj ko potrebuje domet! Pomagaj mu in sestavi funkcijo domet(v, kot), ki na eno decimalko natančno izračuna domet krogle, če s hitrostjo v ustrelimo pod kotom kot stopinj. Če si pozabil, gre za poševni met Za g vzemi kar 10 m/s^2, zračni upor pa zanemari.

>>> domet(10, 45)
10.0
>>> domet(10, 60)
8.7

Uradna rešitev

import math
def domet(v, kot):
    '''Domet pri poševnem metu'''
    kotRad = kot * math.pi / 180
    dom = v*v*math.sin(2*kotRad)
    g = 10.0
    zaokr = round(dom / g, 1)
    return zaokr

Mirko in Slavko

Za uvod si preberite nekaj o Mirku in Slavku:

1. podnaloga

Prevara s čekom

Kurirji so iznajdljivi. Seveda Mirko in Slavko pa sploh. V roke sta dobila ček, kjer banka prinositelju izplača vrednos na njem napisanega tromestnega zneseka. Ampak Mirko ne bi bil Mirko, če ne bi kaj hitro ugotovil, da z malo spretnosti in ostrim nožičem lahko ček neopazno spremeni tako, da premeša števke na znesku. A kaj, ko je Mirko bolj slab v matematiki, rad pa bi ček popravil tako, da bo dobil kar se da veliko. Potoži se Slavku. Ah, to pa ja ni problem. Poglej to funkcijo. Malo jo spremeni, pa boš dobil največje možno število. Mirko sedaj proučuje

   def kajDelam(n):
       '''Pozor, n je obvezno tromestno naravno število
          Spremenljivke imajo namenoma čudna imena.
       '''
       a = n - n % 10
       b = a // 10  % 10
       c = n - a
       d = n // 100
       e = max(b, c, d)
       f = min(b, c, d)
       g = b + c + d - e - f
       return f, g, e

Premisli kaj funkcija počne in na osnovi ideje v njej namesto Mirka sestavi funkcijo najTromestno, ki iz danega tromestnega števila sestavi največje možno tromestno število

>>> najTromestno(137)
731
>>> najTromestno(625)
652

Uradna rešitev

def najTromestno(n):
    '''Iz števk danega tromestnega števila naredi največje možno število'''
    enice = n % 10
    desetice = n // 10 % 10
    stotice = n // 100
    najmanjše = min(enice, desetice, stotice)
    največje = max(enice, desetice, stotice)
    srednje = enice + desetice + stotice - najmanjše - največje # srednje po velikosti
    število = največje * 100 + srednje * 10 + najmanjše
    return število

2. podnaloga

Mirko, pazi metak!

Verjetno najbolj znamenit dialog med Mirkom in Slavkom je:

Kako hitro se mora Mirko skloniti, če Slavko strel opazi n metrov proč

Sestavi funkcijo skloniSe(kolikoM, hitrostMetka), ki pove, v koliko sekundah, desetinkah in stotinkah se mora Mirko skloniti, če Slavko opazi metek kolikoM metrov proč in ima hitrost hitrostMeta m/s. Pazi, da bodo stotinke ustrezno zaokrožene!

Uradna rešitev

def skloniSe(kolikoM, hitrostMetka):
     '''V koliko sekundah, destinkah in stotinkah se mora Mirko skloniti, če Slavko opazi metek `kolikoM` metrov proč in
        ima hitrost `hitrostMeta` m/s.'''
     čas = kolikoM/hitrostMetka
     časStotink = intas * 100 + 0.5) # če prištejemo 0.5, bomo prav zaokrožili
     stotink = časStotink % 10
     desetink = asStotink // 10) % 10
     sekund = časStotink // 100
     return (sekund, desetink, stotink)

3. podnaloga

Metak mrzkega neprijatelja

Slavka skrbi, če bo tudi on dovolj hiter, da bo ubežal krogli. Zato mu sestavi program, ki bo meril njegov rekacijski čas.

Če na začetek programa napišemo

  import time

bomo, med drugim, dobili funkcijo time, ki s klicem time.time() vrne čas v sekundah od nekega trenutka v davni preteklosti. Napiši program, ki bo izpisal Slavko, pazi metak! in izmeril, koliko časa je trajalo, da je Slavko pritisnil na tipko Enter in potem izpisal, koliko sekund je Slavko potreboval za pritisk na tipko. Namig: če veš, koliko je bila ura pred klicem funkcije input in koliko je bila ura po klicu, znaš izračunati, koliko časa je minilo vmes.

>>>Slavko, pazi metak!
Slavko je reagiral v 2.503019332885742 s.

Uradna rešitev

import time
začetek = time.time()
input('Slavko, pazi metak!')
konec = time.time()
print('Slavko je reagiral v', konec - začetek, 's.')
print('\n')

4. podnaloga

Mirko in Slavko ob pomoči Dimnjačara pečeta palačinke

Mirko in Slavko sta v uspešni akciji zaplenila velike količine moke in jajc. Zato bosta za celo vas Glavuša na Kozari napekla palačinke.

Ampak kaj, ko ne vesta koliko. Dimnjačar jima je zato napisal funkcijo A kaj, ko mu je tik preden je odšel, izpod listov trpotca, ki jih je imel na čelu namesto obveze padlo par kapelj krvi in je sedaj funkcija

   def kolikoPalačink(steviloOdraslih, steviloOtrok):
      '''Vrne število paslačink potrebnih, da nasiti vse povabljene'''
      PACKA
      PACKA
      palacinkeOdrasli = steviloOdraslih * odrasel
      palacinkeOtroci = steviloOtrok * otrok
      palacinkeSkupaj = palacinkeOdrasli + palacinkeOtroci + PACKA # še malo za rezervo
      return palacinkeSkupaj

Na srečo pa so ostali še trije izpisi, ko jima je pokazal delovanje funkcije. Pomagaj Mirku in Slavku in dopolni funkcijo, da se bo obnašala kot prej, če so izpisi

   Koliko je odraslih: 12
   Koliko otrok: 5
   Napeči je potrebno 77 palačink.
   Koliko je odraslih: 21
   Koliko otrok: 14
   Napeči je potrebno 140 palačink.
   Koliko je odraslih: 10
   Koliko otrok: 15
   Napeči je potrebno 87 palačink.

Uradna rešitev

def kolikoPalačink(steviloOdraslih, steviloOtrok):
   '''Vrne število paslačink potrebnih, da nasiti vse povabljene'''
   odrasel = 5
   otrok = 2
   palacinkeOdrasli = steviloOdraslih * odrasel
   palacinkeOtroci = steviloOtrok * otrok
   palacinkeSkupaj = palacinkeOdrasli + palacinkeOtroci + 7 # še malo za rezervo
   return palacinkeSkupaj

5. podnaloga

Slavko peče torte

Po velikem uspehu s peko palačink, se je Slavko spravil peči torte. Po receptu za torto potrebujemo 0.8 kg margarine, 2 kg moke in 1.5 kg sladkorja. Sedaj Slavka zanima, kakšno je, glede na količine sestavin, ki jih ima na razpolago, največje možno število tort, ki jih lahko naredi.

Namig: Funkcija min vrne najmanjšega izmed svojih parametrov.

Primer: Če imamo 5kg margarine, 7kg moke in 3.5kg sladkorja, lahko spečemo dve torti.

Slavku sestavi funkcijo kolikoTort(margarina, moka, sladkor), ki glede na dani recept določi največje možno število tort.

Uradna rešitev

def kolikoTort(margarina, moka, sladkor):
    '''Koliko lahko največ spečemo tort'''
    receptMargarina = 0.8 # količina margarine po receptu
    receptMoka = 2 # količina moke za eno torto po receptu
    receptSladkor = 1.5 # količina sladkorja po receptu
    # koliko tort glede na posamezno sestavimo
    izMoke = int(moka/receptMoka)
    izMargarine = int(margarina/receptMargarina)
    izSladkorja = int(sladkor/receptSladkor)
    možnoTort = min(izMoke, izMargarine, izSladkorja)
    return možnoTort

6. podnaloga

Mirko in smučarski skoki

Medtem, ko Slavko peče torte, je Mirko organiziral tekmovanje v smučarskih skokih.

Pri smučarskih skokih so točke skoka vsota:

Vsak od petih sodnikov lahko skakalcu dodeli največ 20 točk, ki so odvisne od položaj smuči med letom, ravnotežja med letom, položaja telesa, pristanka ipd. Točke sloga so vsota točk posamičnih sodnikov, pri čemer se najboljša in najslabša ocena ne upoštevata.

Mirko ima več kot dovolj dela z iskanjem primernih sodnikov (pa še z njegovo matematiko je bolj tako, tako ...). Zato mu pomagaj in sestavi funckijo točkeSlog(oc1,oc2, oc3, oc4, oc5), ki za danih 5 ocen določi točke za slog. Namig: Poleg funkcije min Python pozna tudi funkcijo max, ki se obnaša podobno!

Uradna rešitev

def točkeSlog(oc1,oc2, oc3, oc4, oc5):
    '''Koliko točk za slog je dobil skakalec'''
    vseSkupaj = oc1 + oc2 + oc3 + oc4 + oc5
    najslabša = min(oc1,oc2, oc3, oc4, oc5)
    najboljša = max(oc1,oc2, oc3, oc4, oc5)
    return vseSkupaj - najslabša - najboljša